package io.ent.common.utils;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class FileTypeUtil {
	
	public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();     
    
    private FileTypeUtil(){}     
//    static{     
//        getAllFileType(); //初始化文件类型信息     
//    }     
    
    public final static void clearFileType(){
    	FILE_TYPE_MAP.clear();
    }
    
    /**   
     * getAllFileType,常见文件头信息
     */     
	public final static void getAllFileType() {
		FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG (jpg)
		FILE_TYPE_MAP.put("png", "89504E47"); // PNG (png)
		FILE_TYPE_MAP.put("gif", "47494638"); // GIF (gif)
		FILE_TYPE_MAP.put("tif", "49492A00"); // TIFF (tif)
		FILE_TYPE_MAP.put("bmp", "424D"); // Windows Bitmap (bmp)
		FILE_TYPE_MAP.put("dwg", "41433130"); // CAD (dwg)
		FILE_TYPE_MAP.put("html", "68746D6C3E"); // HTML (html)
		FILE_TYPE_MAP.put("rtf", "7B5C727466"); // Rich Text Format (rtf)
		FILE_TYPE_MAP.put("xml", "3C3F786D6C");
		FILE_TYPE_MAP.put("zip", "504B0304");
		FILE_TYPE_MAP.put("rar", "52617221");
		FILE_TYPE_MAP.put("psd", "38425053"); // Photoshop (psd)
		FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); // Email  [thorough only](eml)
		FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)
		FILE_TYPE_MAP.put("pst", "2142444E"); // Outlook (pst)
		FILE_TYPE_MAP.put("xls", "D0CF11E0"); // MS Word
		FILE_TYPE_MAP.put("xlsx", "504B0304");//docx和xlsx变成一个打包的压缩文件
		FILE_TYPE_MAP.put("doc", "D0CF11E0"); // MS Excel 注意：word 和 excel的文件头一样
		FILE_TYPE_MAP.put("docx", "504B0304");//docx和xlsx变成一个打包的压缩文件
		FILE_TYPE_MAP.put("mdb", "5374616E64617264204A"); // MS Access (mdb)
		FILE_TYPE_MAP.put("wpd", "FF575043"); // WordPerfect (wpd)
		FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
		FILE_TYPE_MAP.put("ps", "252150532D41646F6265");
		FILE_TYPE_MAP.put("pdf", "255044462D312E"); // Adobe Acrobat (pdf)
		FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); // Quicken (qdf)
		FILE_TYPE_MAP.put("pwl", "E3828596"); // Windows Password (pwl)
		FILE_TYPE_MAP.put("wav", "57415645"); // Wave (wav)
		FILE_TYPE_MAP.put("avi", "41564920");
		FILE_TYPE_MAP.put("ram", "2E7261FD"); // Real Audio (ram)
		FILE_TYPE_MAP.put("rm", "2E524D46"); // Real Media (rm)
		FILE_TYPE_MAP.put("mpg", "000001BA"); //
		FILE_TYPE_MAP.put("mov", "6D6F6F76"); // Quicktime (mov)
		FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); // Windows Media (asf)
		FILE_TYPE_MAP.put("mid", "4D546864"); // MIDI (mid)
	}
	
	/**   
     * getFileType,常见文件类头信息
     */     
	public final static void getFileType() {
		FILE_TYPE_MAP.put("xml", "3C3F786D6C");
		FILE_TYPE_MAP.put("xlsx", "504B0304");
		FILE_TYPE_MAP.put("doc", "D0CF11E0"); // MS Excel 注意：word 和 excel的文件头一样
		FILE_TYPE_MAP.put("docx", "504B0304");
		FILE_TYPE_MAP.put("pdf", "255044462D312E"); // Adobe Acrobat (pdf)
	}
	
	/**   
     * getImageType,常见图片类头信息
     */     
	public final static void getImageType() {
		FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG (jpg)
		FILE_TYPE_MAP.put("png", "89504E47"); // PNG (png)
		FILE_TYPE_MAP.put("gif", "47494638"); // GIF (gif)
		FILE_TYPE_MAP.put("tif", "49492A00"); // TIFF (tif)
		FILE_TYPE_MAP.put("bmp", "424D"); // Windows Bitmap (bmp)
	}
	/**
	 * getVideoType,常见视频类头信息
	 */
	public final static void getVideoType() {
		FILE_TYPE_MAP.put("3gp", "000000");
		FILE_TYPE_MAP.put("mp4", "000000");
		FILE_TYPE_MAP.put("rmvb", "2e524d46");
		FILE_TYPE_MAP.put("mov", "6D6F6F76");
		FILE_TYPE_MAP.put("avi", "41564920");
		FILE_TYPE_MAP.put("m4v", "000000");
	}
	
	/**
	 * getImageFileType,获取图片文件实际类型,若不是图片则返回null
	 * @param File
	 * @return fileType
	 */
	public final static String getImageFileType(File f) {
		if (isImage(f)) {
			try {
				ImageInputStream iis = ImageIO.createImageInputStream(f);
				Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
				if (!iter.hasNext()) {
					return null;
				}
				ImageReader reader = iter.next();
				iis.close();
				return reader.getFormatName();
			} catch (IOException e) {
				return null;
			} catch (Exception e) {
				return null;
			}
		}
		return null;
	}
  
	/** 
     * getFileByFile,获取文件类型,包括图片,若格式不是已配置的,则返回null
     * @param file 
     * @return fileType 
     */  
	public final static String getFileByFile(File file) {
		String filetype = null;
		byte[] b = new byte[50];
		try {
			InputStream is = new FileInputStream(file);
			is.read(b);
			filetype = getFileTypeByStream(b);
			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filetype;
	}
	
    /** 
     * getFileTypeByStream,获取文件类型,包括图片,若格式不是已配置的,则返回null
     * @param InputStream is 
     * @return fileType 
     */  
	public final static String getFileTypeByStream(InputStream is) {
		String filetype = null;
		byte[] b = new byte[50];
		try {
			is.read(b);
			filetype = getFileTypeByStream(b);
			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filetype;
	}
      
    /** 
     * getFileTypeByStream
     * @param b 
     * @return fileType 
     */  
	public final static String getFileTypeByStream(byte[] b) {
		String filetypeHex = String.valueOf(getFileHexString(b));
		Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator();
		while (entryiterator.hasNext()) {
			Entry<String, String> entry = entryiterator.next();
			String fileTypeHexValue = entry.getValue();
			if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
				return entry.getKey();
			}
		}
		return null;
	}
      
    /**
     * isImage,判断文件是否为图片
     * @param file
     * @return true 是 | false 否
     */
	public static final boolean isImage(File file) {
		boolean flag = false;
		try {
			BufferedImage bufreader = ImageIO.read(file);
			int width = bufreader.getWidth();
			int height = bufreader.getHeight();
			if (width == 0 || height == 0) {
				flag = false;
			} else {
				flag = true;
			}
		} catch (IOException e) {
			flag = false;
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}
    
    /** 
     * getFileHexString 
     * @param b 
     * @return fileTypeHex 
     */  
	public final static String getFileHexString(byte[] b) {
		StringBuilder stringBuilder = new StringBuilder();
		if (b == null || b.length <= 0) {
			return null;
		}
		for (int i = 0; i < b.length; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}
    
//	/**
//	 * 得到上传文件的文件头
//	 * @param src
//	 * @return
//	 */
//	public static String bytesToHexString(byte[] src) {
//		StringBuilder stringBuilder = new StringBuilder();
//		if (src == null || src.length <= 0) {
//			return null;
//		}
//		for (int i = 0; i < src.length; i++) {
//			int v = src[i] & 0xFF;
//			String hv = Integer.toHexString(v);
//			if (hv.length() < 2) {
//				stringBuilder.append(0);
//			}
//			stringBuilder.append(hv);
//		}
//		return stringBuilder.toString();
//	}
//	
//	/**
//	 * 根据指定文件的文件头判断其文件类型
//	 * @param filePaht
//	 * @return
//	 */
//	public static String getFileType(InputStream is){
//		String res = null;
//		try {
//			byte[] b = new byte[10];
//			is.read(b, 0, b.length);
//			String fileCode = bytesToHexString(b);	
//			System.out.println(fileCode);
//			//这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点
//			Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();
//			while(keyIter.hasNext()){
//				String key = keyIter.next();
//				if(key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())){
//					res = FILE_TYPE_MAP.get(key);
//					is.close();
//					break;
//				}
//			}
//			is.close();
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		return res;
//	}
//	
//	/**
//	 * 根据指定文件的文件头判断其文件类型
//	 * @param filePaht
//	 * @return
//	 */
//	public static String getFileType(String filePath){
//		String res = null;
//		try {
//			FileInputStream is = new FileInputStream(filePath);
//			byte[] b = new byte[10];
//			is.read(b, 0, b.length);
//			String fileCode = bytesToHexString(b);	
//			System.out.println(fileCode);
//			//这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点
//			Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();
//			while(keyIter.hasNext()){
//				String key = keyIter.next();
//				if(key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())){
//					res = FILE_TYPE_MAP.get(key);
//					is.close();
//					break;
//				}
//			}
//			is.close();
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		return res;
//	}

	public static void main(String[] args) throws Exception {
		
		String fileName = "aaaaaaa.bbbbpng";
		String prefix=fileName.substring(fileName.lastIndexOf(".")+1);
		System.out.println(prefix);
		
//		FileTypeUtil.getAllFileType();
//		File f = new File("E:/upload/20151012093804.jpg");
//		if (f.exists()) {
//			String filetype1 = getImageFileType(f);
//			System.out.println(filetype1);
//			String filetype2 = getFileByFile(f);
//			System.out.println(filetype2);
//		}
//		String type = getFileType("E:/upload/20151012093804.jpg");
//		System.out.println("== : "+type);
//		System.out.println(); 
		
//		type = getFileType("E:/upload/s.jpg");
//		System.out.println("s : "+type);
//		System.out.println(); 
	}
}